#include "mainwindow.h"

#include <QDateTime>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{

    /* 设置最显示位置与大小 */
    this->setGeometry(0, 0, 800, 480);
    /* 最大储存 maxSize - 1 个数据 */
    maxSize = 51;
    /* x 轴上的最大值 */
    maxX = 5000;
    /* y 轴最大值 */
    maxY = 40;

    /* splineSeries 曲线实例化（折线用 QLineSeries） */
   splineSeries = new QSplineSeries();
   /* 图表实例化 */
   chart = new QChart();
   /* 图表视图实例化 */
   chartView = new QChartView();

   /* 坐标轴 */
   axisX = new QValueAxis();
   axisY = new QValueAxis();

   /* 定时器 */
   timer = new QTimer(this);

   /* 图例legend 译图例类型，以绘图的颜色区分，本例设置为隐藏 */
   chart->legend()->hide(); // 隐藏图例
   /* chart 设置标题 */
   chart->setTitle(tr("实时动态曲线示例"));
   chart->setTitleBrush(QBrush(Qt::red));
   chart->setBackgroundBrush(QBrush(Qt::black));
   chart->setBackgroundPen(QPen(Qt::SolidLine));
   /* 添加一条曲线 splineSeries */
   chart->addSeries(splineSeries);

   /* 设置显示格式 "%i" 表示标签将以整数的形式显示。 */
   axisY->setLabelFormat("%i");
   /* y 轴标题 */
   axisY->setTitleText("温度/℃");
   axisY->setTitleBrush(QBrush(Qt::green));
   axisY->setLabelsColor(QColor(Qt::darkMagenta));
   axisY->setGridLineColor(QColor(Qt::blue));
   /* y 轴标题位置（设置坐标轴的方向） */
   chart->addAxis(axisY,Qt::AlignLeft);
   /* 设置 y 轴范围 */
   axisY->setRange(0,maxY);

   /* 将 splineSeries 附加于 y 轴上 */
   splineSeries->attachAxis(axisY); // 通过调用 attachAxis()，将数值轴作为参数传递给数据系列，可以将该数值轴与该系列关联起来，从而确保系列的数据将与轴对齐并正确显示。

   /* 设置显示格式 */
   axisX->setLabelFormat("%i");
   /* x 轴标题 */
   axisX->setTitleText("时间/ms");
   axisX->setTitleBrush(QBrush(Qt::green));
   axisX->setLabelsColor(QColor(Qt::darkMagenta));
   axisX->setGridLineColor(QColor(Qt::yellow));
   /* x 轴标题位置（设置坐标轴的方向） */
   chart->addAxis(axisX, Qt::AlignBottom);
   /* 设置 x 轴范围 */
   axisX->setRange(0, maxX);
   /* 将 splineSeries 附加于 x 轴上 */
   splineSeries->attachAxis(axisX);
   splineSeries->setColor(QColor(Qt::white));

   /* 将图表的内容设置在图表视图上 */
   chartView->setChart(chart);

   /* 设置抗锯齿 */
   chartView->setRenderHint(QPainter::Antialiasing);
   chartView->setPalette(QPalette(Qt::cyan));

   /* 设置为图表视图为中心部件 */
   this->setCentralWidget(chartView);

   /* 定时 200ms */
   timer->start(200);
   /* 信号槽连接 */
   connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeOut()));

   /* 设置随机种子，随机数初始化 */
   qsrand(time(NULL));

}

MainWindow::~MainWindow()
{
}

void MainWindow::receivedData(int data)
{
    /* 判断数据是否小于0，如果小于0则设为0 */
    if(data < 0){
        data = 0;
    }
    /* 如果数据大于最大值，则设置为最大值 */
    if(data > maxY){
        data = maxY;
    }

    /* 将数据添加到 data 容器中 */
    this->data.append(data);
    /* 当储存数据的个数大于最大值时，把第一个数据删除 */
    while (this->data.size() > maxSize) {
         /* 移除 data 中第一个数据 */
         this->data.removeFirst();
     }

    /* 先清空 */
    splineSeries->clear();

    /* 计算 x 轴上的点与点之间显示的间距 maxX = 5000 */
    // 5000的x线条是由maxSize-1(容器下标从0开始 数量)个组成，每段之间的间隔
    int xSpace = maxX / (maxSize - 1);
    qDebug()<<"xSpace = "<<xSpace;

    /* 添加点，xSpace * i 表示第 i 个点(y)的 x 轴的位置 */
    for (int i = 0; i < this->data.size(); ++i) {
        splineSeries->append(xSpace * i, this->data.at(i));
        splineSeries->setColor(QColor(randomColor()));
    }

    /* 设置插值点的密度，值越大曲线越平滑 */
    splineSeries->setPointsVisible(true); // 设置插值点可见
    splineSeries->setPointLabelsVisible(true); // 设置插值点标签不可见
    splineSeries->setPointLabelsColor(QColor(randomColor()));
}


void MainWindow::timerTimeOut()
{
    /* 产生随机 0~maxY 之间的数据 */
    this->receivedData(qrand() % maxY ); // y
}

